package com.zhuo.controller;

import com.zhuo.bean.Person;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;

@Controller
public class ResponseTestController {

    /**
     * 给前端自动返回JSON数据
     * ● 1、返回值处理器（ReturnValueHandler）判断是否支持这种类型返回值 supportsReturnType
     * ● 2、返回值处理器调用 handleReturnValue 进行处理
     * ● 3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。
     *   ○ 1.  利用 MessageConverters 进行处理 将数据写为json
     *     ■ 1、内容协商（浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型）
     *     ■ 2、服务器最终根据自己自身的能力，决定服务器能生产出什么样内容类型的数据，
     *     ■ 3、SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ，看谁能处理？
     *       ● 1、得到MappingJackson2HttpMessageConverter可以将对象写为json
     *       ● 2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。
     *
     * 返回值支持的；类型
     *      ModelAndView
     *      Model
     *      View
     *      ResponseEntity
     *      ResponseBodyEmitter
     *      StreamingResponseBody
     *      HttpEntity
     *      HttpHeaders
     *      Callable
     *      DeferredResult
     *      ListenableFuture
     *      CompletionStage
     *      WebAsyncTask
     *      有 @ModelAttribute 且为对象类型的
     *      @ResponseBody 注解 ---> RequestResponseBodyMethodProcessor；
     *
     * postman分别测试返回json和xml
     *      只需要改变请求头中Accept字段，Http协议中规定，告诉服务器本客户端可以接收的数据类型
     *
     * @return
     */
    @GetMapping("/test/person")
    @ResponseBody
    public Person getPerson(){
        Person person = new Person();
        person.setAge(26);
        person.setBirth(new Date());
        person.setUserName("张三");

        return person;
    }

    @ResponseBody   //RequestResponseBodyMethodProcessor
    @GetMapping("/he11")
    public FileSystemResource file(){
        //以文件的方式返回，是谁处理的？
        return null;
    }
}
